#!/bin/bash
##Linux测试脚本集合主脚本
#Update_Time:2020年09月27日_23:19:36
if [[ -f "./item.sh" ]];then
    source ./item.sh
else
    echo "无法找到主题文件[ ./item.sh ]"
    exit 11
fi
mkdir -p /Test/ /log/
install_config="/install_config.sh"
test_config="/test_config.sh"
echo_install(){
####配置参数写入
echo '##------------------全局变量--------------##
source  /etc/profile
##Java安装路径配置，默认使用系统变量赋值[请慎重配置]
export JAVA_HOME="$JAVA_HOME"

##设置源码存放及安装路径
INS_DIR='/data/'

##当前系统类型[UOS/NKLIN/]
AHCR='UOS'
##当前CPU架构[mips64/arm64]
ARCH='arm64'

##--------------------Lmbence Config-------------------##
##Lmbence源码存放路径[zip格式]，请根据实际操作系统环境指定
##主要分为UOS&ARM环境与其他环境[./lmbench3_ARM_UOS.zip]、[lmbench3_all.zip],默认启用UOS
#export Lmbence_ZIP='./lmbench3_all.zip'
export Lmbence_ZIP='./lmbench3_ARM_UOS.zip'

##--------------------UnixBench Config ------------------##
##UnixBench源码存放路径
export UnixBench_ZIP='./UnixBench.zip'

 
##--------------------iozone Config---------------------##
##iozone_current源码存放路径
export iozone_ZIP='./iozone.zip'
 
##--------------------netperf Config------------------##
##希望设置netperf源码的存放主路径
export netperf_ZIP='./netperf.zip'


##--------------------LTP Config------------------##
export LTP_ZIP='./LTP.zip'
 
##--------------------SPECJVM Config--------------------##
##SPECJVM源码路径[已安装请忽略]
export SPECJVM_ZIP='./SPECjvm.zip'


####################录入完成确认区##########################
##如编辑完成请在下面的=输入任意字符串[y/n],此变量将作为唯一验证信息录入的依据,仅限小写
export installer_config=n'  > $install_config
}
echo_test(){
echo '##------------------全局变量--------------##
#需要重定向的存放目录,建议保持默认[必填]
export LOG_DIR='/LOG'

##--------------------Lmbence Config-------------------##
##Lmbence源码存放路径[zip格式]，请根据实际操作系统环境指定

##--------------------UnixBench Config ------------------##
##UnixBench数据重定向目录
export UnixBench_DIR="${LOG_DIR}/UnixBench/"
##安装所在目录
export UnixBench_installer_DIR="${INS_DIR}UnixBench/"
##设置测试的次数[默认3]
export UnixBench_number=3

 
##--------------------iozone Config---------------------##
##iozone_current路径
export iozone_DIR='/opt/iozone3_430/src/current/'
##本机内存大小[单位:GB]
export RAM='128'
##iozone测试创建文件存放目录[优先选择SSD，且容量大于本机内存的两倍,如容量不足再考虑使用HDD]
export iozone_file_dir='/opt/'
 
##--------------------netperf Config------------------##
##设置netperf服务端的IP地址[需对端开启netserver服务]
export netperf_SERVER='172.16.0.100'
export netperf_log="${LOG_DIR}/netperf/"


##--------------------LTP Config------------------##
##设置测试数据存放目录
export LTP_LOG_DIR="${LOG_DIR}/LTP/"
##设置压力测试的时长[单位：小时]
export LTP_TIME='60'


##--------------------SPECJVM Config--------------------##
##设置SPECjvm2008的安装目录
export SPECJVM_INSTALLER='/SPECjvm2008/'
##设置测试次数
export SPECJVM_NUMBER='1'

##--------------------create_file Config------------------##
##设置需要创建文件测试的路径【需自行挂载,优先使用SSD测试】
create_DIR='/opt/'

##--------------------USB_storage Config------------------##
##设置USB设备的挂载路径
USB_DIR='/usb/'


##--------------------Stream Config------------------##
##设置测试数据存放路径
export Stream_LOG="${LOG_DIR}/Stream/"
##设置测试CPU核心数
export OMP_NUM="64"
##设置Stream的安装路径
export Stream_DIR="/opt/stream_v5.9/"


####################录入完成确认区##########################
##如编辑完成请在下面的=输入任意字符串[y/n],此变量将作为唯一验证信息录入的依据,仅限小写
export Config_check=n'  > $test_config
}

######################测试项定义区
LMBench_Test(){
    source $test_config
    pushd $UnixBench_installer_DIR
    chmod -R 777 *
    make clean
    cmd "results"        
    make results
    check "$?" 'make results测试' 'make results'
    make see
    if [[ "$?" -eq "0" ]];then
        print_green_zt "第一次测试成功"
    else
        print_red_z_z_bg "测试结果异常" "请检查配置文件"
        exit 11
    fi
    for((i=2;i<=3;i++));do
            cmd "rerun"
			make rerun
			check "$?"  "第${i}次[make rerun]测试" "make rerun"
    done	    
}
Unixbench_test(){
    logs
    source $test_config
    pushd "$UnixBench_installer_DIR"
    if [[ -e "./Run" ]];then
        chmod -R 777 *
        for((i=1;i<=${UnixBench_number};i++));do
            mkdir -p ${UnixBench_DIR}
             cmd "./Run > ${UnixBench_DIR}Unixbench${i}.log"
            ./Run > ${UnixBench_DIR}Unixbench${i}.log
             check "$?" "Unixbench执行测试" "./Run > ${UnixBench_DIR}Unixbench${i}.log"
        done
    else
        print_red_z "设置的Unixbench安装目录找不到文件[./Run]"
        exit 11
    fi
}
iozone_Test(){
    logs
    mkdir -p ${LOG_DIR}/iozone/
    source $test_config
    pushd "$iozone_DIR"
    RAMS="`expr $RAM / 2` $RAM `expr $RAM \* 2`"
    for i in $RAMS;do
	log_file="${LOG_DIR}/iozone/iozone${i}G.log"
	touch $log_file
    c="./iozone -a -i 0 -i 1 -i 2 -f ${iozone_file_dir}testfile -r 16m -s ${i}G | tee -a ${log_file}"
    cmd "$c"
    $c
    check "$?" "${i}GB测试" "$c"
    cp ${log_file} ${LOG_DIR}/iozone/
	check "$?" "复制测试数据" "cp iozone${i}G.log ${LOG_DIR}/iozone/"
	print_red_z_green_z "测试数据已存放至:" "[${LOG_DIR}/iozone/]"
	rm -f ${iozone_DIR}testfile
    done
}
SPECjvm_test(){
    logs
    source $test_config
    source  /etc/profile
    if [[ ! -d "$SPECJVM_INSTALLER" ]];then
        print_red_z "路径[$SPECJVM_INSTALLER]不存在"
        return 1
    fi
    if [[ -z "$JAVA_HOME" ]];then
        print_red_z "变量[JAVA_HOME]不存在"
        return 1
    else
        if [[ ! -d "$JAVA_HOME" ]];then
            print_red_z "路径[$JAVA_HOME]不存在"
            return 1
        fi
    fi
    pushd "$SPECJVM_INSTALLER"
    if [[ -f "./run-specjvm.sh" ]];then
        c="./run-specjvm.sh startup.helloworld -ikv > ${LOG_DIR}/specjvm_startup.helloworld.log" 
        cmd "$c"
        $c
        status="$?"
        check "$status" "specjvm测试检测" "$c"
        if [[ "$status" -eq "0" ]];then
            for((i=1;i<=${SPECJVM_NUMBER};i++));do
                c="./run-specjvm.sh --base"
                cmd "$c"
                $c
                if [[ "$?" -eq "0" ]];then
                    times=`date`
                    echo -e "[specjvm]第[${i}]次测试完成,时间:[$times]" | tee -a ${LOG_DIR}/specjvm${i}.log
                else
                    echo -e "[specjvm]测试完成,但是好像遇到了问题,时间:[$times]" | tee -a ${LOG_DIR}/specjvm_error${i}.log
                fi
            done
        else
            times=`date`
            print_red_z "测试环境检测失败,时间:[$times]" | tee -a ${LOG_DIR}/specjvm_chek.log
        fi
    else
        print_red_z "目录[$SPECJVM_INSTALLER]下未找到run-specjvm.sh脚本文件"
        return 1
    fi
}
stream_test(){
    logs
    source $test_config
    pushd $Stream_DIR
    cd $Stream_DIR
    chmod -R 777 *
    export OMP_NUM_THREADS=1
    export GOMP_CPU_AFFINITY=0
    for((i=1;i<=3;i++));do
        taskset -c 0 ./stream | tee -a ${LOG_DIR}/stream-single.log
        check "$?" "单线程测试" "taskset -c 0 ./stream | tee -a ${LOG_DIR}/stream-single.log"
    done
    unset OMP_NUM_THREADS
    OMP_NUM_THREADS=$OMP_NUM
    for((i=1;i<=3;i++));do
        taskset -c 0 ./stream | tee -a ${LOG_DIR}/stream-multi.log
        check "$?" "多线程测试" "taskset -c 0 ./stream | tee -a ${LOG_DIR}/stream-multi.log"
    done
    check "$?" "stream" "全部stream测试项"
}  
USB_storage(){
    mkdir -p /logs/
    if [[ -d "${USB_DIR}" ]];then
        c="dd if=/dev/zero of=${USB_DIR}4k bs=4k count=800000  | tee -a /logs/usb4k"
        cmd "$c"
        $c
        check "$?" "USB读写性能4K测试" "$c"
        rm -f ${USB_DIR}4k

        c="dd if=/dev/zero of=${USB_DIR}8k bs=8k count=400000 | tee -a /logs/usb8k"
        cmd "$c"
        $c
        check "$?" "USB读写性能8K测试" "$c"
        rm -f ${USB_DIR}8k
        
        c="dd if=/dev/zero of=${USB_DIR}16k bs=16k count=200000 | tee -a /logs/usb16k"
        cmd "$c"
        $c
        check "$?" "USB读写性能16K测试" "$c"
        rm -f ${USB_DIR}16k

        c="dd if=/dev/zero of=${USB_DIR}32k bs=32k count=100000 | tee -a /logs/usb32k"
        cmd "$c"
        $c
        check "$?" "USB读写性能32K测试"  "$c"
        rm -f ${USB_DIR}32k

        c="dd if=/dev/zero of=${USB_DIR}64k bs=64k count=50000 | tee -a /logs/usb64k"
        cmd "$c"
        $c
        check "$?" "USB读写性能64K测试"  "$c"
        rm -f ${USB_DIR}64k
        print_red_z_green_z "测试结果已保存至:" "[/logs/]目录下"
    else
        print_red_z "找不到设置的路径[${USB_DIR}]"
        check "1" "USB存储测试" "无"
    fi
}
netperf_test(){
	if [[ -f "/usr/sbin/netperf" ]];then
		print_green_zt "测试工具已安装"
	else
		if [[ -f "/usr/bin/netperf" ]];then
			print_green_zt "测试工具已安装"
		else
			print_red_z_z_bg "未安装测试工具"
			exit 1
		fi
	fi
	mkdir -p $netperf_log
	print_green_zt "正在进行测试"
	if [[ -z "$netperf_SERVER" ]];then
		print_red_z "未配置服务器IP地址"
	else
		print_green_zt "正在检测连通性"
		ping $netperf_SERVER -c 5 > /dev/null
		if [[ "$?" -eq '0' ]];then
			print_green_zt '对端连接成功'
			type="TCP_CRR TCP_RR TCP_STREAM UDP_RR UDP_STREAM"
			for t in $type;do
				for((i=1;i<=3;i++));do
					print_green_zt "正在进行${type}第${i}轮测试"
					c="netperf -t ${type} -H ${d_ip} -l 60 | tee -a ${netperf_log}${type}${i}.log"
					cmd "$c"
					$c
					check "$?" "${type}第${i}次测试" "$c"
				done
			done
            print_red_z_green_z "测试结果已保存至:" "[${netperf_log}]目录下"
		else
			print_red_z "对端连接失败"
			exit 1
		fi
	fi
}
create_file(){ 
    logs
    source $test_config
    if [[ ! -d "$1" ]];then
        echo "路径[$1]不存在"
    else
        pushd $create_DIR
        size="512 1024 5120"
        bs="1M"
        rm -rf file/
        mkdir file/
        echo "BS大小为1M"
        for i in $size;do
            echo -e "当前块大小为:${i}M"
            c="dd if=/dev/zero of=file/file_${i} bs=$bs count=$i"
            cmd "$c"
            $c
            if [[ "$?" == "0" ]];then
                echo "${i}MB文件创建成功"
                a="成功"
            else
                echo "${i}MB文件创建失败"
                a="失败"
            fi
            c="cp file/file_${i} file/file_${i}.cp"
            cmd "$c"
            $c
            if [[ "$?" == "0" ]];then
                echo -e "${i}MB文件复制成功,复制文件为:\nfile/file_${i}.cp"
                b="成功"
            else
                echo "${i}MB文件复制失败"
                b="失败"
            fi
            c="tar -cf file/file_${i}.tar file/file_${i}"
            cmd "$c"
            $c
            if [[ "$?" == "0" ]];then
                echo "${i}MB文件压缩成功"
                c="成功"
            else
                echo '${i}MB文件压缩失败,请手动测试'
                c="失败"
            fi
            c="cp file/file_${i} file/file_${i}.create"
            cmd "$c"
            $c
            c="tar -xvf file/file_${i}.tar"
            cmd "$c"
            $c
            if [[ "$?" == "0" ]];then
                echo "解压成功"
                d="成功"
            else
                echo "解压失败"
                d="失败"
            fi
            echo -e "${i}M文件测试结果:
        创建:${a}
        复制:${b}
        压缩:${c}
        解压:${d}"
            echo "文件详情如下:"
            du -sh file/*
            echo '测试文件已删除'
            rm -rf file/*
        done
    fi
}
config_check(){
	if [[  -z "$1" ]];then
		print_red_z_z_bg "${2}" "未设置\n"
		set_not="$set_not $2"  
	else
		print_red_z_green_z_info "${2}" "已设置\n"
		set="$set $2"
	fi
}
source $test_config $install_config
config_check "$JAVA_HOME" "JAVA_HOME"
config_check "$UnixBench_ZIP" "UnixBench安装"
config_check "$iozone_ZIP" "iozone安装"
config_check "$netperf_ZIP" "netperf安装"
config_check "$SPECJVM_ZIP" "SPECJVM安装"

config_check "$UnixBench_DIR" "UnixBench测试"
config_check "$iozone_DIR" "iozone_DIR测试"
config_check "$netperf_SERVER" "netperf服务器参数"
config_check "$SPECJVM_INSTALLER" "SPECJVM安装"



performance(){
    logs
	input '请选择需要使用的测试工具
[1]LMBench
[2]UnixBench
[3]netperf
[4]SPECjvm2008
[5]stream
[6]iozone
[7]磁盘文件创建测试
[8]USB读写测试' type
	expr $type "+" 10 >> /dev/null
	if [[ $? -eq '0' ]];then
		case "$type" in
			"1") LMBench_test 
			;;
			"2") Unixbench_test
			;;
			"3") echo '3'
			;;
			"4") SPECjvm_test
			;;
            "5") stream_test
            ;;
            "6") iozone_Test
            ;;
            "7") create_file
            ;;
            "8") USB_storage
            ;;
		esac
	else
		if [[ "$type" == "A" || "$type" == 'a' ]];then
			echo 'use all'
		else
			echo 'select errors'
		fi
	fi
}
##如果检测到有传参，则判断传入的参数为需要执行的函数


help() {
    print_red_z "使用帮助:"
    print_red_z_green_z "脚本参数作用:" "-t #测试类型【详情看函数功能对照表】\n-n #测试次数:【默认3】"
    print_green_zt "函数功能对照表如下"
    print_red_z_green_z "文件创建测试" "[create_file]" 
    print_red_z_green_z "USB读写测试" "[USB_storage]" 
    print_red_z_green_z "CPU线程测试" "[stream_test]" 
    print_red_z_green_z "JAVA虚拟性能测试" "[SPECjvm_test]"
    print_red_z_green_z "磁盘读写测试" "[iozone_Test]"
    print_red_z_green_z "Unixbench性能测试" "[Unixbench_test]"
    print_red_z_green_z "LMBench性能测试" "[LMBench_test]"
    print_red_z_green_z "示例(命令取[]包含的内容，不包含[]本身):\t" "[bash spzx_Test.sh -f 'create_file']"
    print_red_z_green_z "同时支持多个函数一次传入,例如:\t" "[bash spzx_Test.sh -f 'create_file iozone_Test Unixbench_test']"
    exit 1
}
#开始检测当前用户权限
USER_CHECK
#检测配置文件
if [[ ! -f "$install_config" ]];then
	echo_install
	print_red_z_z_bg "请先配置:" "\nvim $install_config"
	exit 11
else
    if [[ ! -f "$test_config" ]];then
        	echo_test
        	print_red_z_z_bg "请先配置:" "\nvim $test_config"
        exit 11
    else
        if [[ "$Config_check" -eq 'y' ]];then
            echo '继续'
        else
            print_red_z_z_bg "请先配置:" "\nvim $test_config"
        fi
    fi
    if [[ "$installer_config" -eq 'y' ]];then
            echo '继续'
    else
            print_red_z_z_bg "请先配置:" "\nvim $test_config"
    fi
fi
while getopts 't:n' OPT; do
    case $OPT in
        "LMBench_test") LMBench_test 
        ;;
        "Unixbench_test") Unixbench_test
        ;;
        "3") echo '3'
        ;;
        "SPECjvm_test") SPECjvm_test
        ;;
        "stream_test") stream_test
        ;;
        "iozone_Test") iozone_Test
        ;;
        "create_file") create_file
        ;;
        "USB_storage") USB_storage
        ;;
        'h')help
        ;;
        '?')help
        ;;
        'help')help
        ;;
        '-help')help
        ;;
    esac
done
